package com.lzy.ninegrid;

import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.Rect;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.nfc.Tag;
import android.support.v4.content.ContextCompat;
import android.support.v4.view.ViewCompat;
import android.text.TextPaint;
import android.util.AttributeSet;
import android.util.Log;
import android.util.TypedValue;
import android.view.MotionEvent;
import android.widget.ImageView;

/**
 * 九宫格imageView包装器
 */
@SuppressLint("AppCompatCustomView")
public class NineGridViewWrapper extends ImageView {

    //显示更多的数量
    private int moreNum = 0;
    //默认的遮盖颜色
    private int maskColor = 0x88000000;
    //显示文字的大小单位sp
    private float textSize = 20;
    //显示文字的颜色
    private int textColor = 0xFFFFFFFF;

    private Context mContext;
    //文字的画笔
    private TextPaint textPaint;
    //图片类型画笔
    private Paint typePaint;
    //要绘制的文字
    private String msg = "";
    //显示图片类型
    private String imgType = "";
    private static final String TAG = "NineGridViewWrapper";

    //包装器
    public NineGridViewWrapper(Context context) {
        this(context, null);
    }

    public NineGridViewWrapper(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public NineGridViewWrapper(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        this.mContext = context;

        //转化单位
        textSize = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, textSize, getContext().getResources().getDisplayMetrics());
        textPaint = new TextPaint();
        //文字居中对齐
        textPaint.setTextAlign(Paint.Align.CENTER);
        //抗锯齿
        textPaint.setAntiAlias(true);
        //设置文字大小
        textPaint.setTextSize(textSize);
        //设置文字颜色
        textPaint.setColor(textColor);

        //图片类型
        typePaint = new Paint();
        //抗抖动
        typePaint.setDither(true);
        //用来对Bitmap进行滤波处理，这样，当你选择Drawable时，会有抗锯齿的效果
        typePaint.setFilterBitmap(true);
    }

    /**
     * 画布方法
     *
     * @param canvas 画布
     */
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        //如果是多张就九宫格展示
        if (moreNum > 0) {
            float baseY = getHeight() / 2 - (textPaint.ascent() + textPaint.descent()) / 2;
            canvas.drawText("", getWidth() / 2, baseY, textPaint);
        }

        Bitmap mIcon = null;
        if ("gif".equals(imgType)) {
            mIcon = ((BitmapDrawable) ContextCompat.getDrawable(mContext, R.drawable.icon_gif)).getBitmap();
        } else if ("长图".equals(imgType)) {
            mIcon = ((BitmapDrawable) ContextCompat.getDrawable(mContext, R.drawable.icon_long)).getBitmap();
        }
        if (mIcon != null) {
            @SuppressLint("DrawAllocation")
            Rect src = new Rect(0, 0, mIcon.getWidth(), mIcon.getHeight());
            @SuppressLint("DrawAllocation")
            Rect dst = new Rect(5, getHeight() - mIcon.getHeight() - 8, 5 + mIcon.getWidth(), getHeight() - 8);
            canvas.drawBitmap(mIcon, src, dst, typePaint);
        }
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {

        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                Drawable drawable = getDrawable();
                if (drawable != null) {
                    /**
                     * 默认情况下，所有的从同一资源（R.drawable.XXX）加载来的drawable实例都共享一个共用的状态，
                     * 如果你更改一个实例的状态，其他所有的实例都会收到相同的通知。
                     * 使用使 mutate 可以让这个drawable变得状态不定。这个操作不能还原（变为不定后就不能变为原来的状态）。
                     * 一个状态不定的drawable可以保证它不与其他任何一个drawabe共享它的状态。
                     * 此处应该是要使用的 mutate()，但是在部分手机上会出现点击后变白的现象，所以没有使用
                     * 目前这种解决方案没有问题
                     */
                    //drawable.mutate().setColorFilter(Color.GRAY, PorterDuff.Mode.MULTIPLY);
                    drawable.setColorFilter(Color.GRAY, PorterDuff.Mode.MULTIPLY);
                    ViewCompat.postInvalidateOnAnimation(this);
                }
                break;
            case MotionEvent.ACTION_MOVE:
                break;
            case MotionEvent.ACTION_CANCEL:
            case MotionEvent.ACTION_UP:
                Drawable drawableUp = getDrawable();
                if (drawableUp != null) {
//                    drawableUp.mutate().clearColorFilter();
                    drawableUp.clearColorFilter();
                    ViewCompat.postInvalidateOnAnimation(this);
                }
                break;
            default:
                break;
        }

        return super.onTouchEvent(event);
    }

    @Override
    protected void onDetachedFromWindow() {
        super.onDetachedFromWindow();
        setImageDrawable(null);
    }

    public String getImgType() {
        return imgType;
    }

    public void setImgType(String imgType) {
        this.imgType = imgType;
    }

    public int getMoreNum() {
        return moreNum;
    }

    public void setMoreNum(int moreNum) {
        this.moreNum = moreNum;
        msg = "+" + moreNum;
        invalidate();
    }

    public int getMaskColor() {
        return maskColor;
    }

    public void setMaskColor(int maskColor) {
        this.maskColor = maskColor;
        invalidate();
    }

    public float getTextSize() {
        return textSize;
    }

    public void setTextSize(float textSize) {
        this.textSize = textSize;
        textPaint.setTextSize(textSize);
        invalidate();
    }

    public int getTextColor() {
        return textColor;
    }

    public void setTextColor(int textColor) {
        this.textColor = textColor;
        textPaint.setColor(textColor);
        invalidate();
    }
}